iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0
自我挑戰組

laravel+vue 學習系列 第 10

Day10. Laravel 請求生命週期

  • 分享至 

  • xImage
  •  

一、主要流程

  • Laravel 收到用戶的請求
  • app 產生 Request 物件(用來接收處理用戶請求內容)
  • 經過許多軟體層(e.g. Middleware) 到達 app 核心
  • app 在處理完用戶請求後, 產生 Response 物件, 用來製作回傳給用戶的資訊

二、啟動應用程式

  • 伺服器設定將收到的請求轉到 public/index.php, 主要做以下動作:
    • 載入 composer 設定的 autoload 檔案
    • 啟動 Laravel 程序建立 app 容器
    • 建立 Kernel 實例與一個請求代表使用者, 傳遞給 Kernel 回應 Response 物件
  • Kernel
    • 為核心路由器, 主要將接收用戶請求轉給 middler 處理、處理例外、傳給網頁路由器、回傳最終的回應
    • 有兩種 Kernel
      • HTTP Kernel 處理 web 請求
      • 主控台 Kernel 處理主控台、Cron、Artisan 請求
    • 處理在啟動時必要的 bootstrap
  • 服務提供者 Service Providers
    • 封裝 app 啟動要執行時所需要的 Class( 需要先註冊提供給 app 才可正常執行啟動 )
    • 主要方法
      • register() 方法: 因在此方法被調用時, 尚未完全啟動 app ,因此有些程序無法在此方法執行(有可能會報錯誤訊息)
      • boot() 方法: 可在此做任何啟動要執行的動作(e.g. 註冊、監聽、路由),服務提供者註冊後才被呼叫
    • 推遲 defer: 當只需告知 app 要如何解析特定類別, 可以在 app 實際發出請求該類別, 才會繼續執行接下的功能
      • 實作 Illuminate\Contracts\Support\DeferrableProvider
          use Illuminate\Contracts\Support\DeferrableProvider;
      
          class ClientSocketServiceProvider extends ServiceProvider implements DeferrableProvider {
              protected $defer = true;
              public function provides() {
                  return [
                      ClientSocket::class,
                  ];
              }
          }
      

三、app 接收 Request

  • Laravel Illuminate\Http\Request 類別源自 Symfony HttpFoundation\Request 物件
  • 將收集到的用戶請求製作成 Request 物件提供 app 流程使用
  • 主要功能:
    • 接收使用者表單輸入, 相關方法 all(), input(), only() ... 等
    • 取得用戶請求狀態, 相關方法 method(), path(), ip() ... 等
    • 接收檔案, 相關方法 file(), allFiles() ... 等
    • 持久保存操作與 session, cookie 等互動, 相關方法 flash(), flashOnly(), old() ... 等

四、app 產生 Response

  • Illuminate\Http\Response 類別繼承 Symfony\Component\HttpFoundation\Response
  • Response 產生後代表 app 給用戶的回應, 包含標題、cookie、回傳內容等 ...
  • 主要功能
    • 設定標頭, 使用 header() 方法
    • 添加 cookie , 使用 cookie() 方法
    • 回傳 view 頁面
    • 下載檔案、檔案顯示(e.g. PDF)
    • 轉址設定

五、Middleware

  • 通常包含與應用程式分開的邏輯 e.g. 查看用戶IP驗證、設定 cookie 或 session
  • 為第一個與最後一個與請求和回應互動的地方
  • 建立 middleware 方法
        php artisan make:middleware ProductDelete
    
        # 位於 app/Http/Middleware/ProductDelete
        class ProductDelete {
            public function handle($request, Closure $new){
                return $next($request);
            }
        }
    
  • 依照註冊順序處理處理請求
    • 請求會被傳遞給其他 middleware 最後達到 app
    • app 處理好後會再依序傳回給 middleware
    • 第一個 middleware 也會是最後一個 middleware
    • 使用 $next Closure 來傳遞 Request 給下一個 middleware
  • 綁定 middleware
    • 位置 app/Http/Kernel.php
    • 全域綁定
        protected $middleware = [
            // \App\Http\Middleware\TrustHosts::class,
            \App\Http\Middleware\TrustProxies::class,
            \Fruitcake\Cors\HandleCors::class,
        ];
    
    • 綁定路由 middleware
        protected $routeMiddleware = [
            'auth' => \App\Http\Middleware\Authenticate::class,
            'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        ];
    
        # 套用路由 middleware 
        Route::get('product', [ProductController:class, 'create')->middleware('auth');
    
    • middleware 群組
      • 預設有 web 和 api 負責處理請求
        protected $middlewareGroups = [
            'web' => [
                \App\Http\Middleware\EncryptCookies::class,
                \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
                \Illuminate\Session\Middleware\StartSession::class,
                // \Illuminate\Session\Middleware\AuthenticateSession::class,
                \Illuminate\View\Middleware\ShareErrorsFromSession::class,
                \App\Http\Middleware\VerifyCsrfToken::class,
                \Illuminate\Routing\Middleware\SubstituteBindings::class,
            ],
    
            'api' => [
                // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
                'throttle:api',
                \Illuminate\Routing\Middleware\SubstituteBindings::class,
            ],
        ];
    

上一篇
Day9. 後台靜態頁面 ( Blade + Mix )
下一篇
Day11. 測試
系列文
laravel+vue 學習32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言